package gov.pr.celepar.sentinela.admin.action.restricao;

import gov.pr.celepar.framework.util.Data;
import gov.pr.celepar.sentinela.admin.action.BaseAction;
import gov.pr.celepar.sentinela.admin.dao.GrupoDAO;
import gov.pr.celepar.sentinela.admin.dao.RestricaoHorarioDAO;
import gov.pr.celepar.sentinela.admin.dao.SistemaDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.form.restricao.RestricaoGrupoForm;
import gov.pr.celepar.sentinela.admin.pojo.Grupo;
import gov.pr.celepar.sentinela.admin.pojo.RestricaoGeral;
import gov.pr.celepar.sentinela.admin.pojo.RestricaoGrupo;
import gov.pr.celepar.sentinela.admin.pojo.RestricaoHora;
import gov.pr.celepar.sentinela.admin.pojo.Sistema;
import gov.pr.celepar.sentinela.util.SentinelaUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class RestricaoGrupoAction extends BaseAction {
	private static Log logger = LogFactory.getLog(RestricaoSistemaAction.class);

	private SistemaDAO sistemaB = null;

	private GrupoDAO grupoB = null;

	private RestricaoHorarioDAO restricaoB = null;

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		RestricaoGrupoForm restricaoGrupoForm = (RestricaoGrupoForm) form;

		DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
		this.sistemaB = daoFactory.getSistemaDAO();
		this.grupoB = daoFactory.getGrupoDAO();
		this.restricaoB = daoFactory.getRestricaoDAO();

		this.listarSistemasAutorizados(request);

		if (request.getParameter("sub") != null
				&& request.getParameter("sub").equals("incluir")) {
			this.comunicacao.autorizaOperacao('A', request, response);
			logger.debug("sub ADD");
			incluirSub(restricaoGrupoForm, request);
			consultar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "alterar_restringirGrupo";

		} else if (request.getParameter("sub") != null
				&& request.getParameter("sub").equals("excluir")) {
			this.comunicacao.autorizaOperacao('A', request, response);
			logger.debug("sub REMOVE");
			excluirSub(restricaoGrupoForm, request);
			consultar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "alterar_restringirGrupo";

		} else if (this.CONF_ALTERAR.equalsIgnoreCase(restricaoGrupoForm
				.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			alterar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "alterar_restringirGrupo";

		} else if (this.CONF_INCLUIR.equalsIgnoreCase(restricaoGrupoForm
				.getAcao())) {
			this.comunicacao.autorizaOperacao('I', request, response);
			logger.debug("confirma_inclusao");
			incluir(restricaoGrupoForm, request);
			consultar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "alterar_restringirGrupo";

		} else if (this.CONF_EXCLUIR.equalsIgnoreCase(restricaoGrupoForm
				.getAcao())) {
			this.comunicacao.autorizaOperacao('E', request, response);
			excluir(restricaoGrupoForm, request);
			restricaoGrupoForm.reset(mapping, request);
			return "lista_restringirGrupo";

		} else if (this.INCLUIR.equalsIgnoreCase(restricaoGrupoForm.getAcao())) {
			this.comunicacao.autorizaOperacao('I', request, response);
			return "incluir_restringirGrupo";

		} else if (this.EXCLUIR.equalsIgnoreCase(restricaoGrupoForm.getAcao())) {
			this.comunicacao.autorizaOperacao('E', request, response);
			consultar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "excluir_restringirGrupo";

		} else if (this.ALTERAR.equalsIgnoreCase(restricaoGrupoForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			consultar(restricaoGrupoForm, request);
			getListaGrupos(restricaoGrupoForm, request);
			return "alterar_restringirGrupo";
		}
		// default = consultar
		this.comunicacao.autorizaOperacao('L', request, response);
		consultar(restricaoGrupoForm, request);
		getListaGrupos(restricaoGrupoForm, request);
		return "consultar_restringirGrupo";
	}

	private void getListaGrupos(RestricaoGrupoForm form,
			HttpServletRequest request) {

		long[] grupos = this.comunicacao.getIdGrupos();
		Long codGrupos[] = null;
		if (grupos != null) {
			codGrupos = new Long[grupos.length];
			for (int i = 0; i < grupos.length; i++)
				codGrupos[i] = Long.valueOf(grupos[i]);
		}

		if (form.getCodSistema() != null && !form.getCodSistema().equals("")) {
			Collection cG = null;
			try {
				cG = this.sistemaB.getGruposVinculados(Long.decode(form
						.getCodSistema()), new Long(this.comunicacao
						.getCodUsuario()), codGrupos);
			} catch (Exception e) {
				logger.error("", e);
			}
			request.setAttribute("listaGrupos", cG);
		}
	}

	private void incluir(RestricaoGrupoForm form, HttpServletRequest request) {
		RestricaoGeral s = new RestricaoGeral();
		try {
			s.setTipo(RestricaoGeral.RESTRICAO_HORA_GRUPO);
			Sistema sis = new Sistema();
			sis.setCodSistema(Long.decode(form.getCodSistema()));
			s.setSistema(sis);
			s.setDataInicio(Data.formataData(form.getDataInicio()));
			s.setDataFim(Data.formataData(form.getDataFim()));
		} catch (Exception e) {
			this.addMessageAlert("Informa��es inv�lidas", request);
		}
		try {
			this.restricaoB.incluirRestricaoGeral(s);
			// inserido - inserir o código gerado
			form.setCodRestricao(Long.toString(s.getCodRestricao()));
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}

	private void excluir(RestricaoGrupoForm form, HttpServletRequest request) {
		RestricaoGeral s = new RestricaoGeral();

		s.setCodRestricao(Long.decode(form.getCodRestricao()));
		s.setTipo(2);

		try {
			this.restricaoB.excluir(s);
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}

	private void incluirSub(RestricaoGrupoForm form, HttpServletRequest request)
			throws Exception {

		RestricaoGeral rg = new RestricaoGeral();
		rg.setCodRestricao(Long.decode(form.getCodRestricao()));
		rg.setTipo(RestricaoGeral.RESTRICAO_HORA_GRUPO);

		Collection<RestricaoHora> c = new ArrayList<RestricaoHora>();
		String horaInicio = form.getHoraInicio();
		String horaFim = form.getHoraFim();
		RestricaoGrupo rh = new RestricaoGrupo();
		Grupo g = new Grupo();
		g.setCodGrupo(Long.decode(form.getCodGrupo()));
		rh.setGrupo(g);
		rh.setHoraInicio(SentinelaUtil.getMinutosFromHora(horaInicio));
		rh.setHoraFim(SentinelaUtil.getMinutosFromHora(horaFim));
		rh.setDiaNormal(form.getDiaSemanaNormal());
		rh.setSabado(form.getDiaSemanaSabado());
		rh.setDomingo(form.getDiaSemanaDomingo());
		c.add(rh);
		rg.setHoras(c);

		try {
			this.restricaoB.incluirRestricaoGrupo(rg);
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}

	private void excluirSub(RestricaoGrupoForm form, HttpServletRequest request)
			throws Exception {

		RestricaoGeral rg = new RestricaoGeral();
		rg.setCodRestricao(Long.decode(form.getCodRestricao()));
		rg.setTipo(RestricaoGeral.RESTRICAO_HORA_GRUPO);

		int rest[] = form.getRestricoesHoras();
		if (rest == null)
			return;

		Collection<RestricaoHora> c = new ArrayList<RestricaoHora>();
		for (int i = 0; i < rest.length; i++) {
			RestricaoHora rh = new RestricaoGrupo();
			rh.setCodRestricaoHora(Long.valueOf(rest[i]));
			c.add(rh);
		}
		rg.setHoras(c);
		try {
			this.restricaoB.excluirRestricaoGrupo(rg);
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}

	private void alterar(RestricaoGrupoForm form, HttpServletRequest request)
			throws Exception {
		RestricaoGeral sNew = new RestricaoGeral();

		sNew.setCodRestricao(Long.decode(form.getCodRestricao()));
		sNew.setTipo(RestricaoGeral.RESTRICAO_HORA_GRUPO);
		Sistema sis = new Sistema();
		sis.setCodSistema(Long.decode(form.getCodSistema()));
		sNew.setSistema(sis);

		sNew.setDataInicio(Data.formataData(form.getDataInicio()));
		sNew.setDataFim(Data.formataData(form.getDataFim()));
		sNew.setAtivo(form.isAtivo());

		try {
			this.restricaoB.alterarRestricaoGrupo(sNew);
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}

	private void consultar(RestricaoGrupoForm form, HttpServletRequest request)
			throws Exception {

		RestricaoGeral rg = null;
		try {
			rg = this.restricaoB.consultarRestricaoGrupo(Long.decode(form
					.getCodRestricao()));

			form.setCodSistema(Long.toString(rg.getSistema().getCodSistema()));
			form.setDataInicio(Data.formataData(rg.getDataInicio()));
			form.setDataFim(Data.formataData(rg.getDataFim()));
			form.setAtivo(rg.getAtivo());

			form.setHoraInicio("");
			form.setHoraFim("");
			form.setCodGrupo("");
			form.setDiaSemanaDomingo(false);
			form.setDiaSemanaSabado(false);
			form.setDiaSemanaNormal(false);

			Collection c = rg.getHoras();
			Iterator i = c.iterator();
			while (i.hasNext()) {
				RestricaoGrupo g = (RestricaoGrupo) i.next();
				Grupo grp = g.getGrupo();
				g.setGrupo(this.grupoB.consultar(grp.getCodGrupo()));
			}
			request.setAttribute("listaRestricoes", c);
		} catch (Exception e) {
			this.addMessageException(e, request);
		}
	}
}
